Sequencing jobs problem (advanced)
emp
JAMS
GAMS
short
0,
loop((i,j)$(ord(i) < ord(j)),
put emp / 'disjunction *' seq(i,j) 'else' seq(j,i));
putclose emp;
putclose empopt / 'FileName convexhull.gms';
solve sequence_emp using emp min tardiness;
abort$(sequence_emp.objval <> sequence.objval) 'EMP Convex Hull: Incorrect solution', sequence_emp.objval, sequence.objval;
);
*--- EMP BigM
put emp / 'default bigm' M:0:0;
loop((i,j)$(ord(i) < ord(j)),
put emp / 'disjunction *' seq(i,j) 'else' seq(j,i));
putclose emp;
putclose empopt / 'FileName bigm.gms';
solve sequence_emp using emp min tardiness;
abort$(sequence_emp.objval <> sequence.objval) 'EMP BigM: Incorrect solution', sequence_emp.objval, sequence.objval;
*--- EMP Indicators (CPLEX, XPRESS and SCIP only)
$if NOT SOLVER cplex $exit
put emp / 'default indic';
loop((i,j)$(ord(i) < ord(j)),
put emp / 'disjunction *' seq(i,j) 'else' seq(j,i));
putclose emp;
putclose empopt / 'FileName indicators.gms'
/ 'SubSolver cplex';
solve sequence_emp using emp min tardiness;
abort$(sequence_emp.objval <> sequence.objval) 'EMP Indicators: Incorrect solution', sequence_emp.objval, sequence.objval;
*--- with EMP one can also mix & match different reformulation types
*--- and change the parameters used by the reformulation
put emp / 'default indic';
loop((i,j)$(ord(i) < ord(j) and ord(i) < card(i) and ord(j) < card(j)),
put emp / 'disjunction *' seq(i,j) 'else' seq(j,i));
loop((i,j)$(ord(i) < ord(j) and (ord(i) < card(i)/2 and ord(j) = card(j))),
put emp / 'disjunction bigm' M:0:0 '*' seq(i,j) 'else' seq(j,i));
loop((i,j)$(ord(i) < ord(j) and (ord(i) >= card(i)/2 and ord(j) = card(j))),
put emp / 'disjunction chull 4000 *' seq(i,j) 'else' seq(j,i));
putclose emp;
putclose empopt / 'FileName mixandmatch.gms'
/ 'SubSolver cplex';
solve sequence_emp using emp min tardiness;
abort$(sequence_emp.objval <> sequence.objval) 'EMP Mix & Match: Incorrect solution', sequence_emp.objval, sequence.objval;
]]>